package insert;

import java.io.IOException;
import java.sql.Connection;
import java.sql.Date;
import java.sql.PreparedStatement;
import java.sql.SQLException;
import java.util.LinkedList;
import java.util.List;

import javax.naming.Context;
import javax.naming.InitialContext;
import javax.naming.NamingException;
import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.sql.DataSource;

/**
 * Servlet implementation class InscriptionServlet
 */
public class InscriptionServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;
    
    /**
     * @see HttpServlet#HttpServlet()
     */
    public InscriptionServlet() {
        super();
    }
    
	/**
	 * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		//INUTILE
	}
	
	/**
	 * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		String pseudo = request.getParameter("pseudo");
		String nom = request.getParameter("nom");
		String prenom = request.getParameter("prenom");
		String numRue = request.getParameter("numrue");
		int iNumRue = 0;
		String rue = request.getParameter("rue");
		String codePostal = request.getParameter("codepostal");
		int iCodePostal = 0;
		String ville = request.getParameter("ville");
		String telephone = request.getParameter("telephone");
		String mail = request.getParameter("mail");
		String dateNaissance = request.getParameter("datenaissance");
		Date naissance = new Date(0);
		String mdp = request.getParameter("mdp");
		String confirmmdp = request.getParameter("confirmmdp");
		Connection con = null;
		
		List<String> erreur = new LinkedList<String>();
		
		if(pseudo.isEmpty() || nom.isEmpty() || prenom.isEmpty() || numRue.isEmpty() || rue.isEmpty() || codePostal.isEmpty() || ville.isEmpty() || telephone.isEmpty() || mail.isEmpty() || dateNaissance.isEmpty() || mdp.isEmpty() || confirmmdp.isEmpty()) {
			erreur.add("Un des champs obligatoire n'est pas renseign�");
		}
		
		if(pseudo.length() > 20) 	erreur.add("La taille du pseudo est trop longue (maximum 20 caract�res)");
		if(nom.length() > 50) 		erreur.add("La taille du nom est trop longue (maximum 50 caract�res)");
		if(prenom.length() > 25) 	erreur.add("La taille du prenom est trop longue (maximum 25 caract�res)");
		if(numRue.length() > 4)		erreur.add("La taille du numero de rue est trop longue (maximum 4 chiffres)");
		else{
			try{
				iNumRue = Integer.parseInt(numRue);
			}catch(NumberFormatException e){
				erreur.add("Le numero de la rue doit �tre un nombre");
			}
		}
		
		if(rue.length() > 100) 		erreur.add("La taille de la rue est trop longue (maximum 100 caract�res)");
		if(codePostal.length()!=5)	erreur.add("Le code postal doit contenir 5 chiffres");
		else{
			try{
				iCodePostal = Integer.parseInt(codePostal);
			}catch(NumberFormatException e){
				erreur.add("Le code postal doit �tre un nombre");
			}
		}
		if(ville.length() > 50) 	erreur.add("La taille de la ville est trop longue (maximum 50 caract�res)");
		if(telephone.length() > 15) erreur.add("La taille du num�ro de t�l�phone est trop longue (maximum 15 chiffres)");
		else{
			try{
				Integer.parseInt(telephone);
			}catch(NumberFormatException e){
				erreur.add("Le num�ro de t�l�phone doit �tre un nombre");
			}
		}
		if(mail.length() > 80) 		erreur.add("La taille du mail est trop longue (maximum 80 caract�res)");
		
		try{
			String[] buff = dateNaissance.split("/");
			if(buff.length == 3){
				dateNaissance = buff[2] +"-"+buff[1]+"-"+buff[0];
				System.out.println(dateNaissance);
				naissance = Date.valueOf(dateNaissance);
			}else{
				erreur.add("La date de naissance n'est pas valide (format jj/mm/aaa)");
			}
		}catch(IllegalArgumentException e){
			erreur.add("La date de naissance n'est pas valide (format jj/mm/aaa)");
		}
		if(!mdp.equals(confirmmdp)) erreur.add("La mot de passe et la confirmation du mot de passe ne sont pas �gales");
		
		if(!erreur.isEmpty()){ //Donn�es du formulaire incorrectes
			request.setAttribute("erreur", erreur);
			RequestDispatcher dis=request.getRequestDispatcher("inscription.jsp");
			dis.forward(request,response);
		}else{ //Donn�es correctes, envoie de la requete SQL
			PreparedStatement pstmt;
			try {
				Context namingContext = new InitialContext();
				DataSource dataSource = (DataSource)namingContext.lookup("java:comp/env/jdbc/MiniIBay");
				con = dataSource.getConnection();
				
				pstmt = con.prepareStatement("INSERT INTO `membre` (`pseudo`, `password`, `nom`, `prenom`, `numero_rue`, `rue`, `code_postal`, `ville`, `telephone`, `mail`, `date_naissance`) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)");
				pstmt.setString(1, pseudo);
				pstmt.setString(2, mdp);
				pstmt.setString(3, nom);
				pstmt.setString(4, prenom);
				pstmt.setInt(5, iNumRue);
				pstmt.setString(6, rue);
				pstmt.setInt(7, iCodePostal);
				pstmt.setString(8, ville);
				pstmt.setString(9, telephone);
				pstmt.setString(10, mail);
				pstmt.setDate(11, naissance);
				pstmt.executeUpdate();

				response.sendRedirect("../home");
			} catch (NamingException e) {
				response.sendRedirect("../home");
			} catch (SQLException e) {
				response.sendRedirect("../home");
			}finally{
				if(con != null){
					try {
						con.close();
					} catch (SQLException e) {
						// TODO Auto-generated catch block
						e.printStackTrace();
					}
				}
			}
		}
	}
}
